package reflect;

import java.lang.reflect.Method;
import java.util.Scanner;

/**
 * JAVA反射机制
 * 反射机制是一个动态机制,他允许我们在程序[运行期间]再确定实例化,方法的调用,属性的操作等
 * 使得程序的灵活度大大提高,但随之带来更多的系统开销和较低的运行效率.
 * 因此:反射机制不能被过度使用
 *
 */
public class ReflectDemo1 {
    public static void main(String[] args) throws ClassNotFoundException {

        /*
        使用反射机制的第一步:获取要操作的类的类对象,即:Class的实例
        JVM中被加载的类都有且只有一个Class的实例与之对应,该实例就称为被价值的这个类的类对象
        类对象上会记录其表示的类的一切信息(类名,方法信息,属性信息等)
        获取一个类的类对象方式:
        1.类名.class   Class cls = String.class
        2.Class.forName(String className)
        Class cls = Class.forName("java.lang.String") //完全限定名:包名+类名
            参数要求是要加载的类的完全限定名:包名+类名

        3:类加载器ClassLoader形式加载

         */
        //获取String的类对象
//        Class cls = String.class;
        System.out.println("请输入类名:");
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        Class cls = Class.forName("reflect.Person");
        //通过类对象获取String的一切信息
        String name = cls.getName();//获取类名(完全限定名)
        System.out.println(name);
        name = cls.getSimpleName();//获取类名
        System.out.println(name);


        //获取包名
        Package p = cls.getPackage();
        System.out.println(p);
        /*
            Class称为类对象,其每一个实例用于表示一个类的信息
            Method称为方法对象,其每一个实例用于表示一个方法的信息
            通过Method可以:
            获取一个方法的所有信息(方法名,参数信息,返回值类型,访问修饰符等)
            可以通过对象执行这个方法.
         */
        Method[] methods = cls.getMethods();//获取String的所有方法
        for(Method m : methods){
            System.out.println(m.getName());//获取方法名
        }
    }
}
